package criterios;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import baseDeDatos.GestorBD;
import datosFamilias.*;

public class CriterioNinios extends CriterioAbstracto
{ 
    private String consultaNinios;
    public static ArrayList<String> edades = null;
    
    public CriterioNinios(GestorBD base)
    {
        baseDeDatos = base;
        if (edades == null)
        {
            setDefaultEdadesSeleccionadas();
        }
        cargarConsulta();
    }
   
    private void cargarConsulta()
    { 
        consultaNinios = "SELECT e.id, e.name, e.surname, YEAR( CURDATE( ) ) - YEAR( e.borndate ) + IF( DATE_FORMAT( CURDATE( ) , '%m-%d' ) > DATE_FORMAT( e.borndate, '%m-%d' ) , 0, -1 ), e.direction_id "
                       + "FROM people e "
                       + "WHERE ";
        
        for(int index = 0; index < edades.size(); index++)
        {
            switch(edades.get(index))
            {
                 case "bebe": consultaNinios = consultaNinios + "((CAST( e.borndate AS DATETIME )) > ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 1 YEAR ) ))"; break;
                 case "infante": consultaNinios = consultaNinios + "((CAST( e.borndate AS DATETIME )) < ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 1 YEAR ) )) AND "
                                                                 + "((CAST( e.borndate AS DATETIME )) > ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 6 YEAR ) ))"; break;
                 case "ninio": consultaNinios = consultaNinios + "((CAST( e.borndate AS DATETIME )) < ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 6 YEAR ) )) AND "
                                                               + "((CAST( e.borndate AS DATETIME )) > ( SELECT DATE_SUB( CURDATE( ) , INTERVAL 12 YEAR ) )) "; break;
            }
            if(index+1 < edades.size())
            {
                consultaNinios += " OR ";
            }
        }
    }

    @Override
    public void ejecutarConsultas(ArrayList<Familia> familias, int criterio)
    {
         try 
         {
            if(!edades.isEmpty())
            {
                // Realizamos la consulta
                ResultSet resultadosNinios = baseDeDatos.consultar(consultaNinios);

                // Mientras haya tuplas resultado
                while(resultadosNinios.next())
                {
                    String direccionNinio = resultadosNinios.getString(5);
                    int index = 0;

                    // Buscamos la familia correspondiente al ninio de acuerdo a la direccion
                    while(index < familias.size() && !direccionNinio.equals(familias.get(index).obtenerDireccion()))
                    {
                        index++;
                    }

                    Familia f = familias.get(index);
                    Persona persNin = null;

                    int edadNinio = resultadosNinios.getInt(4);

                    // Verificamos si la persona fue creada, en caso de que exista la obtenemos, caso contrario, la creamos.
                    if(f.existeIntegrante(resultadosNinios.getInt(1)))
                    {
                        persNin = f.obtenerIntegrante(resultadosNinios.getInt(1));
                    }
                    else
                    {
                        persNin = new Persona(resultadosNinios.getInt(1), resultadosNinios.getString(2)+" "+resultadosNinios.getString(3), resultadosNinios.getInt(4), direccionNinio);
                        f.agregarIntegrante(persNin);
                    }

                    // Agregamos que la persona es alguna clase de ninio
                    if(edadNinio < 1)
                        persNin.agregarDato("bebe", criterio);
                    else
                        if(edadNinio < 6)
                            persNin.agregarDato("infante", criterio);
                        else
                            persNin.agregarDato("ninio", criterio);
                }
            }
        } 
        catch (SQLException ex) 
        {
            Logger.getLogger(CriterioAnciano.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    // METODOS DE INTERACCION CON LA INTERFAZ GRAFICA
    
    public static ArrayList<String> getDefaultEdades()
    {
        ArrayList<String> defaultEdades = new ArrayList<String>();
        defaultEdades.add("bebe");
        defaultEdades.add("infante");
        defaultEdades.add("ninio");
        return defaultEdades;
    }
    
    public static void setEdadesSeleccionadas(ArrayList<String> edadesSeleccionadas)
    {
        edades = edadesSeleccionadas;
    }
    
    public static void setDefaultEdadesSeleccionadas()
    {
        edades = getDefaultEdades();
    }
}